package org.example.dao;

import org.example.model.User;
import org.example.util.DBUtil;
import org.junit.Assert;
import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

//dao做数据库crud操作
//用户表的crud
public class UserDao {

    //根据账号查询用户信息
    public static User queryByUsername(String username) {
        Connection c = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            //1.获取数据库连接
            c = DBUtil.getConnection();
            String sql = "select * from user where username=?";
            //2.创建操作命令对象
            ps = c.prepareStatement(sql);
            //替换占位符: 第一个参数是占位符的索引（从1开始）
            ps.setString(1, username);
            //3.执行sql：查询是executeQuery方法，返回结果集
            rs = ps.executeQuery();
            //4.处理结果集
            while(rs.next()){
                User user = new User();
                //转换一行数据为一个用户对象，返回
                user.setUsername(username);//结果集账号和传入的是一样的
                user.setPassword(rs.getString("password"));
                return user;
            }
            return null;
        }catch (Exception e){
            //捕获到异常，应该如何做？
            //打印异常，返回null：不合适，我们返回null是表示账号不存在，这里出异常是程序出错
//            e.printStackTrace();
//            return null;
            throw new RuntimeException("根据账号查询用户出错", e);
        }finally {
            DBUtil.close(c, ps, rs);
        }
    }

    //单元测试：验证用户登录的查询
    @Test
    public void testQueryByUsername(){
        User query1 = queryByUsername("abc");
        System.out.println(query1);
        Assert.assertNull(query1);
        User query2 = queryByUsername("bit");
        System.out.println(query2);
        Assert.assertNotNull(query2);
    }

}
